package com.estore.network;

import com.estore.model.Product;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class EStoreClient {
    // 任务要求：添加服务器地址和端口作为成员变量
    private static final String SERVER_HOST = "localhost";
    private static final int SERVER_PORT = 8888;

    // 保留原客户端的购物车、Scanner功能
    private final Map<String, Integer> shoppingCart = new HashMap<>();
    private final Scanner scanner = new Scanner(System.in);


    public void start() {
        while (true) {
            System.out.println("====== 欢迎来到控制台商城 ======");
            System.out.println("1. 浏览所有商品（默认排序）");
            System.out.println("2. 添加商品到购物车");
            System.out.println("3. 查看购物车");
            System.out.println("99. 数据文件备份（管理员功能）");
            System.out.println("5. 退出");
            System.out.print("请输入您的选择: ");
            int choice = scanner.nextInt();
            scanner.nextLine(); // 消费换行符

            switch (choice) {
                case 1:
                    browseProducts(); // 改造后的方法
                    break;
                case 2:
                    addToCart();
                    break;
                case 3:
                    viewCart();
                    break;
                case 99:
                    backupData();
                    break;
                case 5:
                    System.out.println("感谢使用，再见！");
                    return;
                default:
                    System.out.println("无效的选项，请重新输入！");
            }
        }
    }


    // 任务要求：改造browseProducts()，通过Socket请求服务器
    private void browseProducts() {
        Socket socket = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;

        try {
            // 1. 连接服务器
            socket = new Socket(SERVER_HOST, SERVER_PORT);
            // 2. 获取对象流
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());

            // 3. 发送请求字符串
            oos.writeObject("GET_ALL_PRODUCTS");
            oos.flush();

            // 4. 读取响应并转换为商品列表
            Object response = ois.readObject();
            if (response instanceof List<?>) {
                List<Product> products = (List<Product>) response;
                System.out.println("\n--- 商品列表 ---");
                if (products.isEmpty()) {
                    System.out.println("商店里还没有商品。");
                } else {
                    products.forEach(System.out::println);
                }
            } else {
                System.out.println("服务器响应异常：" + response);
            }

        } catch (IOException | ClassNotFoundException e) {
            System.err.println("商品浏览失败：" + e.getMessage());
        } finally {
            // 5. 确保Socket关闭
            try {
                if (ois != null) ois.close();
                if (oos != null) oos.close();
                if (socket != null) socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    // 保留原添加购物车功能（需先浏览商品获取ID）
    private void addToCart() {
        System.out.print("请输入要添加的商品ID: ");
        String productId = scanner.nextLine();

        // 注意：此处需先通过browseProducts()获取商品列表，再手动输入ID
        System.out.print("请输入购买数量: ");
        int quantity = scanner.nextInt();
        scanner.nextLine();

        if (quantity <= 0) {
            System.out.println("错误：购买数量必须为正数！");
            return;
        }

        // 临时逻辑：假设商品存在（实际需优化为从服务器查询商品）
        shoppingCart.put(productId, shoppingCart.getOrDefault(productId, 0) + quantity);
        System.out.println("成功将商品ID为 '" + productId + "' 的商品添加到购物车！");
    }


    // 保留原查看购物车功能
    private void viewCart() {
        System.out.println("\n--- 我的购物车 ---");
        if (shoppingCart.isEmpty()) {
            System.out.println("购物车是空的，快去逛逛吧！");
            return;
        }

        double total = 0.0;
        for (Map.Entry<String, Integer> entry : shoppingCart.entrySet()) {
            String productId = entry.getKey();
            Integer quantity = entry.getValue();
            // 临时逻辑：实际需从服务器查询商品信息
            System.out.printf("商品ID: %-10s | 数量: %-3d\n", productId, quantity);
        }
        System.out.println("------------------------------------");
        System.out.println("（注：商品详情需从服务器查询）");
    }


    // 保留原备份功能
    private void backupData() {
        String srcFile = "products.dat";
        String destFile = "products.dat.bak";
        byte[] buffer = new byte[1024];
        int bytesRead;

        try (FileInputStream fis = new FileInputStream(srcFile);
             FileOutputStream fos = new FileOutputStream(destFile)) {
            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
            System.out.println("数据文件备份成功！备份文件：" + destFile);
        } catch (IOException e) {
            System.err.println("数据文件备份失败：" + e.getMessage());
        }
    }


    public static void main(String[] args) {
        new EStoreClient().start();
    }
}